Query ::= Type Constraints

Arrow ::= "->"
Arrow ::= "~>"

Type ::= "!" Type
Type ::= NAME
Type ::= NAME "<" NO_SPACE Type ">"
Type ::= "(" Type ")"
Type ::= TypeList<",">
Type ::= Type Arrow Type

TypeList<DELIMITER> ::= Type (DELIMITER Type)*

Constraints ::= EMPTY
Constraints ::= "where" TypeConstrains ("," TypeConstrains)*

TypeConstrains ::= Type "<" TypeList<"&">